In [1]:
import numpy as np
%matplotlib notebook
import matplotlib.pyplot as plt
import ipywidgets as widgets
from maux import *

Lineárne lomené funkcie

Lineárna lomená funkcia je určená rovnicou

y=ax+bcx+d,
kde a,b,c,d sú reálne čísla také, že c0 a adbc0. Definičným oborom je množina všetkých reálnych čísel rôznych od dc. Grafom je hyperbola.

Úvodný príklad

Nakreslenie grafu lineárne lomenej funkcie danej rovnicou

y=xx1.
Definičným oborom je množina všetkých reálnych čísel rôznych od 1.

In [2]:
#####
##### nakreslenie grafu funkcie
#####

#### vstupné údaje
def f(X): return X / (X - 1) # ufunc verzia funkcie
X = np.linspace(-5, 7, 12*20+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
X1, X2 = X[X < 1], X[X > 1] # číslo 1 nepatrí do oboru definície
Y1, Y2 = f(X1), f(X2) # odpovedajúce hodnoty závislej premennej

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 7.5) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = \dfrac{x}{x-1}$", fontdict={'verticalalignment': 'bottom'}) # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
#ax.grid() # pravoúhla sieť
ax.set_ylim(-4.5, 5.5) # ohraničenie hodnôt pre osu y
ax.set_xticks(range(-5, 7+1)) # kótovanie x-ovej osi
ax.set_yticks(range(-4, 5+1)) # kótovanie y-ovej osi

## graf funkcie
color = ax.plot([], [])[0].get_color()
ax.plot(X1, Y1, c=color)
ax.plot(X2, Y2, c=color)

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()

Pokračovanie predchadzajúceho príkladu

Vyšetrenie priebehu lineárne lomenej funkcie danej rovnicou

y=xx1.
Tu nás zaujímajú tieto informácie:

  • Nulové body funkcie.
  • Asymptoty grafu funkcie.

Ako vypočítať asymptoty? Všimnime si najprv, že platí

limxxx1x=limx1x1=0limx(xx10x)=limxxx1=limx111x=11limx1x=110=1.
Asymptotou so smernicou v bode je tak priamka y=1. Podobne zistíme, že tá istá priamka je asymptotou so smernicou v bode .

Treba ešte nájsť asymptoty bez smernice grafu funkcie. Všimnime si najprv, že platí

xx1=x1+1x1=1+1x1.
Odtiaľ dostaneme, že
limx1xx1=limx1+xx1=.
Asymptotou bez smernice je tak priamka x=1.

In [3]:
#####
##### vyšetrenie priebehu funkcie
#####

#### vstupné údaje
def f(X): return X / (X - 1) # ufunc verzia funkcie
X = np.linspace(-5, 7, 12*20+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
X1, X2 = X[X < 1], X[X > 1] # číslo 1 nepatrí do oboru definície
Y1, Y2 = f(X1), f(X2) # odpovedajúce hodnoty závislej premennej

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 7.5) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Priebeh funkcie $y = \dfrac{x}{x-1}$", fontdict={'verticalalignment': 'bottom'}) # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
ax.grid() # pravoúhla sieť
ax.set_ylim(-4.5, 5.5) # ohraničenie hodnôt pre osu y
ax.set_xticks(range(-5, 7+1)) # kótovanie x-ovej osi
ax.set_yticks(range(-4, 5+1)) # kótovanie y-ovej osi

## graf funkcie
color = ax.plot([], [])[0].get_color()
ax.plot(X1, Y1, c=color)
ax.plot(X2, Y2, c=color)

## nulové body
ax.plot(0, 0, 'o', label="nulový bod")

## asymptota so smernicou
Ax1 = X
Ay1 = np.ones(len(Ax1))
ax.plot(Ax1, Ay1, '--', lw=1, label=r"asymptota so smernicou")

## asymptota bez smernice
Ay2 = np.linspace(-4.5, 5.5, 10*10+1)
Ax2 = np.ones(len(Ay2))
ax.plot(Ax2, Ay2, '--', lw=1, label="asymptota bez smernice")

## legenda
ax.legend()

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()

Pokyny pre nasledujúce príklady

V nasledujúcich príkladoch budeme kresliť grafy a vyšetrovať priebeh lineárne lomených funkcií. Pretože tieto funkcie majú neohraničený definičný obor, budeme pri zostrojovaní grafu každej takejto funkcie vykreslovať len jej zaujímavú časť. Pri vyšetrovani priebehu týchto funkcií treba určiť:

  • nulové body funkcie;
  • asymptoty grafu funkcie.

Súradnice bodov, ktoré sú zrejmé z grafu, netreba explicitne uvádzať.

Doporučujeme tiež rozdeliť riešenie do dvoch častí:

  • V prvom obrázku nakreslite graf funkcie.
  • V druhom obrázku vyšetrite jej priebeh.
In [4]:
#####
##### šablóna riešenia (nakreslenie grafu a vyšetrenie priebehu funkcie)
#####


#### vstupné údaje
# def f(X): return None # ufunc verzia funkcie
# X = np.linspace(None, None, None+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
# X1, X2 = X[X < None], X[X > None] # číslo None nepatrí do oboru definície
# Y1, Y2 = f(X1), f(X2) # odpovedajúce hodnoty závislej premennej

#### obrázok s jedným diagramom
# fig, ax = plt.subplots()
# fig.set_size_inches(6, 4) # veľkosť obrázka (východzia hodnota je 6x4)

### diagram
# init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
# ax.set_title(r"Graf funkcie $y = \dfrac{ax+b}{cx+d}$", fontdict={'verticalalignment': 'bottom'}) # pomenovanie diagramu
# ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
# ax.set_ylim(None, None) # ohraničenie hodnôt pre osu y
# ax.set_xticks(np.linspace(None, None, None+1)) # kótovanie x-ovej osi
# ax.set_yticks(np.linspace(None, None, None+1)) # kótovanie y-ovej osi

## graf funkcie
# color = ax.plot([], [])[0].get_color()
# ax.plot(X1, Y1, c=color)
# ax.plot(X2, Y2, c=color)

## nulové body funkcie
# ax.plot(None, 0, 'o', label=r"nulový bod")
# ax.annotate(r"$[None,0]$", xy=(None, 0)) # prípadná anotácia význačného bodu

## asymptota so smernicou
# Ax1 = X
# Ay1 = np.ones(len(Ax1)) * None
# ax.plot(Ax1, Ay1, '--', lw=1, label=r"asymptota so smernicou")

## asymptota bez smernice
# Ay2 = np.linspace(None, None, None+1)
# Ax2 = np.ones(len(Ay2)) * None
# ax.plot(Ax2, Ay2, '--', lw=1, label=r"asymptota bez smernice")

## legenda
# ax.legend()
# ax.legend(loc='center') # umiestenie v strede diagramu

### archivácia obrázka
# fig.savefig("<meno súboru>.png")

### samotné zobrazenie
# fig.show()

Úloha

Nakreslite grafy a vyšetrite priebeh týchto funkcií

y=1+x1x.
y=3x1x1.
y=3x+5x+2.
y=5+4xx+1.
y=72x2x+3.

Úloha (3 body)

Nakreslite graf a vyšetrite priebeh funkcie

y=2+3x14x.

Poznámka

V nasledujúcich príkladoch si ukážeme, ako kresliť grafy parametrických systémov lineárne lomených funkcií. V niektorých z nich sa vykreslenie deje pomocou interaktívnych prvkov knižnice ipywidgets.

Dokumentácia:

V príkladoch si tiež aktívne precvičíme niektoré elementárne transformácie grafov funkcií.

Interaktívny príklad

Nakreslenie grafu lineárne lomenej funkcie danej rovnicou

y=ax+bcx+d
pre vybrané hodnoty parametrov a,b,c0,d. Prípad adbc=0 nevylučujeme.

In [5]:
#####
##### grafy parametrického systému funkcií (interaktívna verzia)
#####

#### vstupné údaje
N = 8 # na oboch osiach sa zobrazí interval hodnôt 〈-N, N〉
def f(X, a, b, c, d): return (a * X + b) / (c * X + d)
X = np.linspace(-N, N, 2*N*30+1)

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(8, 9)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
#ax.grid() # pravoúhla sieť
ax.set_ylim(-N, N) # ohraničenie hodnôt pre osu y
#ax.set_xticks(range(-N, N+1)) # kótovanie x-ovej osi
#ax.set_yticks(range(-N, N+1)) # kótovanie y-ovej osi

## graf funkcie
def plot_graph(a, b, c, d):
    n = -d / c
    X1, X2 = X[X < n], X[X > n] # číslo n nepatrí do oboru definície
    ax.set_title(r"Graf funkcie $y = \dfrac{{{0}x+{1}}}{{{2}x+{3}}}$".format(a, b, c, d), fontdict={'verticalalignment': 'bottom'})
    if ax.lines:
        ax.lines[1].set_xdata(X1)
        ax.lines[1].set_ydata(f(X1, a, b, c, d))
        ax.lines[2].set_xdata(X2)
        ax.lines[2].set_ydata(f(X2, a, b, c, d))
    else:
        color = ax.plot([], [])[0].get_color()
        ax.plot(X1, f(X1, 0, 1, 1, 0), c=color)
        ax.plot(X2, f(X2, 0, 1, 1, 0), c=color)

widgets.interact(plot_graph,
                 a=widgets.IntSlider(min=-N//2, max=N//2, value=0),
                 b=widgets.IntSlider(min=-N//2, max=N//2, value=1),
                 c=widgets.SelectionSlider(options=[k for k in range(-N//2, N//2+1) if k != 0], value=1),
                 d=widgets.IntSlider(min=-N//2, max=N//2, value=0),
                )

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()

Interaktívny príklad

Nakreslenie grafu lineárne lomenej funkcie danej rovnicou vo vrcholovom tvare

y=kxm+n
pre vybrané hodnoty parametrov k0, m a n.

In [6]:
#####
##### grafy parametrického systému funkcií (interaktívna verzia)
#####

#### vstupné údaje
N = 8 # na oboch osiach sa zobrazí interval hodnôt 〈-N, N〉
def f(X, k, m, n): return k / (X - m) + n
X = np.linspace(-N, N, 2*N*30+1)
Ax1 = X # asymptota so smernicou
Ay2 = X # asymptota bez smernice

#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(8, 9)

### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
#ax.grid() # pravoúhla sieť
ax.set_ylim(-N, N) # ohraničenie hodnôt pre osu y
#ax.set_xticks(range(-N, N+1)) # kótovanie x-ovej osi
#ax.set_yticks(range(-N, N+1)) # kótovanie y-ovej osi

## graf funkcie
def plot_graph(k, m, n):
    X1, X2 = X[X < m], X[X > m] # číslo m nepatrí do oboru definície
    ax.set_title(r"Graf funkcie $y = \dfrac{{{0}}}{{x-{1}}}+{2}$".format(k, m, n), fontdict={'verticalalignment': 'bottom'})
    Ay1 = n * np.ones(len(Ax1)) # asymptota so smernicou
    Ax2 = m * np.ones(len(Ay2)) # asymptota bez smernice v bode m
    if ax.lines:
        ax.lines[1].set_xdata(X1)
        ax.lines[1].set_ydata(f(X1, k, m, n))
        ax.lines[2].set_xdata(X2)
        ax.lines[2].set_ydata(f(X2, k, m, n))
        ax.lines[3].set_ydata(Ay1) # asymptota so smernicou
        ax.lines[4].set_xdata(Ax2) # asymptota bez smernice v bode m
    else:
        color = ax.plot([], [])[0].get_color()
        ax.plot(X1, f(X1, 1, 0, 0), c=color)
        ax.plot(X2, f(X2, 1, 0, 0), c=color)
        ax.plot(Ax1, Ay1, 'k--', lw=1) # asymptota so smernicou
        ax.plot(Ax2, Ay2, 'k--', lw=1) # asymptota bez smernice v bode m

widgets.interact(plot_graph,
                 k=widgets.SelectionSlider(options=[k for k in range(-N//2, N//2+1) if k != 0], value=1),
                 m=widgets.IntSlider(min=-N//2, max=N//2, value=0),
                 n=widgets.IntSlider(min=-N//2, max=N//2, value=0),
                )

### archivácia obrázka
#fig.savefig("<meno súboru>.png")

### samotné zobrazenie
fig.show()